package com.yangcb.workrecord.volitil;

import java.util.concurrent.CountDownLatch;

/**
 * ${DESCRIPTION}
 *
 * @author yangcb
 * @create 2017-09-28 22:12
 **/
public class VolatileTest {

    //volatile 共享变量 内存共享

    //private static boolean bChanged;
    private static volatile boolean bChanged;

    public static volatile int sum = 0;


    public static void main(String[] args) throws InterruptedException {

        /**
         * 构造函数接收一个int 参数 代表线程数
         *
         * CountDownLatch的await方法会阻塞当前线程，直到N为O为止
         * await(long time,TimeUnit unit) 来指定阻塞的时间，如果等待的时间到达设置的时间，就不在阻塞当前线程
         *
         * 1、解释一下CountDownLatch概念?
         *
         * CountDownLatch是通过一个计数器来实现的，计数器的初始值为线程的数量。每当一个线程完成了自己的任务后，计数器的值就会减1。当计数器值到达0时，它表示所有的线程已经完成了任务，然后在闭锁上等待的线程就可以恢复执行任务。
         *
         * 2、CountDownLatch 和CyclicBarrier的不同之处?
         *
         * 3、给出一些CountDownLatch使用的例子?
         *
         * 4、CountDownLatch 类中主要的方法?
         *
         *
         *
         */
        CountDownLatch latch = new CountDownLatch(10);//等待多线程完成

        for (int i = 1; i <= 10; i++) {
            int j = i;
            new Thread(new Runnable() {
                @Override
                public void run() {
                    int m = (j - 1) * 10 + 1;
                    for (; m <= j * 10; m++) {
                        sum = sum + m;
                    }
                    latch.countDown();

                }
            }).start();
        }

//        Thread.sleep(500);
        latch.await();
        System.out.println("------------------->" + sum);

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (; ; ) {
                    if (bChanged != bChanged) {
                        System.out.println("!=");
                        System.exit(0);
                    }
                }

            }
        }).start();

        Thread.sleep(1);

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (; ; ) {
                    bChanged = !bChanged;
                }
            }
        }).start();


    }


}
